package fourmiefight.controller;

import java.util.Observable;
import java.util.Observer;

import fourmiefight.ihm.FenGenView;
import fourmiefight.ihm.SimulateurIHM;
import fourmiefight.metier.Carte;
import fourmiefight.metier.Food;
import fourmiefight.metier.Fourmiliere;
import fourmiefight.metier.UpdateTimer;

public class Simulateur implements Observer
{
	private boolean stopped;
	private UpdateTimer timer;
	private Carte carte;
	private SimulateurIHM simuIhm;
	private FenGenView fenetre;
	
	private static State etatSimulateur = State.ARRET; // ARRET, PAUSE, DEMARRE

	public enum State 
	{ 
		ARRET, 
		EN_COURS, 
		PAUSE,
	};
	
	public Simulateur(FenGenView fen) 
	{
		fenetre = fen;
		carte = new Carte();
		timer = new UpdateTimer();
		simuIhm = new SimulateurIHM(this);
		simuIhm.setCarte(carte);
		simuIhm.setTimer(timer);
		
//		initialiserCarte();
	}

    public void start() 
    {
		timer.addObserver(this);
		simuIhm.getCanvas().setIgnoreRepaint(true);
		simuIhm.getCanvas().createBufferStrategy(2);
        timer.start();
    }
   
    public synchronized void stop()
    {
        this.stopped = true;
    }
   
    public synchronized boolean isStopped()
    {
        return this.stopped;
    }

	public Carte getCarte() 
	{
		return carte;
	}
	
	public SimulateurIHM getSimuIhm() 
	{
		return simuIhm;
	}

	@Override
	public void update(Observable arg0, Object arg1) 
	{
		// On met à jour la carte (et tous ces éléments) à chaque tic du time (UpdateTime)
		carte.notifATic();
		// Puis on met à jour la vue (IHM)
		simuIhm.gameLoop();		
		
		this.majStats();
		
	}
	
	public void lancerSimu() {
		if (etatSimulateur.equals(State.ARRET)) {
			this.simuIhm.lancerSimu();
			etatSimulateur = State.EN_COURS;
		} else if (etatSimulateur.equals(State.PAUSE)) {
			this.timer.start();
			etatSimulateur = State.EN_COURS;
		}
	}
	
	public void pauseSimu() {
		if (etatSimulateur.equals(State.EN_COURS)) {
			this.timer.resetTimer();
			etatSimulateur = State.PAUSE;
		}
		
	}
	
	public void stopSimu() {
		if (etatSimulateur.equals(State.EN_COURS) || etatSimulateur.equals(State.PAUSE)) {
			this.pauseSimu();
			//this.simuIhm.stopSimu();
			//this.timer.resetTimer();
			//etatSimulateur = State.ARRET;
		}
	}
	
	public void resetSimu() {
		this.simuIhm.resetSimu();
		this.carte.resetCarte();
		this.timer.resetTimer();
	}
	
	public void majStats() {
//		String chaineStatsFourmilliere = "<html><ul>" ;
//		String chaineStatsNourriture = "<html><ul>" ;
//		
//		for (Fourmiliere f : this.carte.getListeFourmiliere()) {
//			chaineStatsFourmilliere += "<li>" + f.getNom() + " => " + f.getNbFourmis() + " fourmis - " + f.getNourriture() + " nour. </li>";
//		}
//		
//		for (Food f : this.carte.getListeFood()) {
//			chaineStatsNourriture += "<li>Nourriture_" + f.getIdd() +  " => " + f.getQuantityLeft() + " nour. </li>";
//		}
//
//		chaineStatsFourmilliere += "</ul></html>" ;
//		chaineStatsNourriture += "</ul></html>" ;
		
		String chaineStatsFourmilliere = "";
		if (this.carte.getListeFourmiliere().size() != 0) {
			chaineStatsFourmilliere = "<html>" +
					"<table style=\"border:1px solid black\">" +
					"<tr>" +
						"<td>Nom</td>" +
						"<td>Fourmis</td>" +
						"<td>Nour.</td>" +
					"</tr>" ;
			
			
			for (Fourmiliere f : this.carte.getListeFourmiliere()) {
				chaineStatsFourmilliere += 
					"<tr>" +
						"<td>" + f.getNom() + "</td>" +
						"<td>" + f.getNbFourmis() + "</td>" +
						"<td>" + f.getNourriture() + "</td>" +
					"</tr>" ;
			}
			chaineStatsFourmilliere += "</table></html>" ;
		}
		
		
		
		String chaineStatsNourriture = "";
		if (this.carte.getListeFood().size() != 0) {
			chaineStatsNourriture = "<html>" +
					"<table style=\"border:1px solid black\">" +
					"<tr>" +
						"<td>Nom</td>" +
						"<td>Nour.</td>" +
					"</tr>" ;
			
			
			for (Food f : this.carte.getListeFood()) {
				chaineStatsNourriture += 
					"<tr>" +
						"<td>Nourriture_" + f.getIdd() + "</td>" +
						"<td>" + f.getQuantityLeft() + "</td>" +
					"</tr>" ;
			}
			chaineStatsNourriture += "</table></html>" ;
		}

		this.fenetre.getJlStatNorth().setText(chaineStatsFourmilliere);
		this.fenetre.getJlStatSouth().setText(chaineStatsNourriture);
	}
	
	/**
	 * Méthode d'initialisation de la carte
	 * Permet d'ajouter des fourmiliere au lancement de l'appli
	 */
	public void initialiserCarte() {
		this.carte.ajouterFourmiliere(100);
		
		System.out.println("-- Lancement --");
		System.out.println("nb de fourmiliere : " + carte.nbFourmiliere());
		System.out.println("nb de fourmi au total : " + carte.nbFourmis());
	}

	public static State getEtatSimulateur() {
		return etatSimulateur;
	}

	public static void setEtatSimulateur(State nouvelEtat) {
		etatSimulateur = nouvelEtat;
	}
	
}
